home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / usenet / st80_pre4 / rotate45.st < prev    next >
Text File  |  1993-07-24  |  5KB  |  175 lines

  1. "    NAME        rotate45
  2.     AUTHOR        pieter@prls.uucp
  3.     FUNCTION Rotating bit-maps 45 degrees
  4.     ST-VERSIONS    ?
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    30 Mar 1990
  10. SUMMARY    These methods allow you to rotate Forms by 45 degrees.
  11. The other angles (135, 225, 315) can easily be implemented.
  12. "!
  13. "
  14. From: pieter@prls.UUCP (Pieter van der Meulen)
  15. Newsgroups: comp.lang.smalltalk
  16. Subject: Rotating bit-maps 45 degrees goodie
  17. Message-ID: <34975@prls.UUCP>
  18. Date: 30 Mar 90 01:56:12 GMT
  19. Organization: Philips R&D Center, Sunnyvale, CA
  20.  
  21. Anybody tried to rotate bit-maps by 45 degrees?
  22. If you are interested and see a use for it, here is a simple
  23. implementation. If you find a better/faster way of doing
  24. it, please post it.
  25.  
  26. These methods allow you to rotate Forms by 45 degrees.
  27. The other angles (135, 225, 315) can easily be implemented.
  28. The lazy way would be to rotate the first by 90, 180 or 270.
  29. See Form>>rotate45 for more information on its use.
  30.  
  31. Try:    Cursor blank showWhile:
  32.             [(Cursor thumbsUp rotate45 shiftBy: 1@0)
  33.                 follow: [Sensor cursorPoint]
  34.                 while: [Sensor noButtonPressed]]
  35.  
  36. I guess it usefull if you want your PC to hitch-hike,
  37. have fun, Pieter.
  38.  
  39. P.S. van der Meulen, MS 02        prls!!pieter
  40. PRLS, Signetics div. of NAPC      -----------
  41. 811 E.Arques Avenue, Sunnyvale, CA 94088-3409
  42. "!
  43.  
  44. !Form methodsFor: 'private'!
  45.  
  46. rotate45Square
  47.     "Rotate a square bitmap by 45 degrees.
  48.     A bitmap of 2 by 2 pixels is mapped a bitmap of 3 by 3:
  49.  
  50.         12        x1x
  51.         34    ->    3x2
  52.                 x4x    
  53.     x indicates a -white- pixel.
  54.  
  55.     See Form>>rotate45 for more information.
  56.     Written by Pieter S. van der Meulen."
  57.  
  58.     | newForm w2 w2Point destForm newBitBlt destBitBlt | 
  59.     (width > 2 or: [height > 2])
  60.         ifFalse:
  61.             [^Form
  62.                 extent: 3@3
  63.                 fromArray: (Array
  64.                     with: (((bits at: 1) bitAnd: 32768) bitShift: -1)
  65.                     with: ((((bits at: 1) bitAnd: 16384) bitShift: -1)
  66.                         bitOr: ((bits at: 2) bitAnd: 32768))
  67.                     with: ((bits at: 2) bitAnd: 16384))
  68.                 offset: 0@0].
  69.     newForm _ Form extent: (width * 2 - 1) asPoint.
  70.     w2 _ width / 2.
  71.     w2Point _ w2 asPoint.
  72.     destForm _ self class extent: w2Point.
  73.     destBitBlt _ (BitBlt 
  74.         destForm: destForm
  75.         sourceForm: self
  76.         halftoneForm: nil
  77.         combinationRule: Form over
  78.         destOrigin: 0@0
  79.         sourceOrigin: 0@0
  80.         extent: w2Point
  81.         clipRect: (0@0 extent: w2Point)).
  82.     destBitBlt copyBits.
  83.     newBitBlt _ BitBlt 
  84.         destForm: newForm
  85.         sourceForm: destForm rotate45Square
  86.         halftoneForm: nil
  87.         combinationRule: Form under
  88.         destOrigin: w2@0
  89.         sourceOrigin: 0@0
  90.         extent: self extent
  91.         clipRect: newForm boundingBox.
  92.     newBitBlt copyBits.
  93.  
  94.     destBitBlt sourceOrigin: 0@w2; copyBits.
  95.     newBitBlt
  96.         sourceForm: destForm rotate45Square;
  97.         destOrigin: 0@w2; copyBits.
  98.  
  99.     destBitBlt sourceOrigin: w2@0; copyBits.
  100.     newBitBlt
  101.         sourceForm: destForm rotate45Square;
  102.         destOrigin: width@w2; copyBits.
  103.  
  104.     destBitBlt sourceOrigin: w2Point; copyBits.
  105.     newBitBlt
  106.         sourceForm: destForm rotate45Square;
  107.         destOrigin: w2@width; copyBits.
  108.     ^newForm! !
  109.  
  110. !Form methodsFor: 'image manipulation'!
  111.  
  112. rotate45
  113.     "Rotate a Form by 45 degrees. Be patient, it is a compute-intensive method.
  114.     Forms are first converted to a rectangular form and then rotated, so a
  115.     100X1 form may be just as slow to rotate as a 100X100 form.
  116.     This method enlarges your original by about 1.4 (2 sqrt), but does not -loose-
  117.     any bits. You may use the <shiftBy: 1@0> method on the result to make it solid.
  118.  
  119.     The original size is almost obtained (but quality is not) if you magnify by (2/3) :
  120.         (((Form fromUser rotate45 shiftBy: 1@1)
  121.                 magnifyBy: 2@2) shrinkBy: 3@3) display.
  122.  
  123.     The best result however is obtained if you only shift the result, try:
  124.         (Form fromUser rotate45 shiftBy: 1@0) display.
  125.     Written by Pieter S. van der Meulen."
  126.  
  127.     | rotSize rotForm | 
  128.     rotSize _ width max: height.
  129.     rotSize _ 2 raisedTo: ((rotSize-1) asFloat floorLog: 2)+1.
  130.     rotForm _ self class extent: rotSize asPoint.
  131.     (BitBlt 
  132.         destForm: rotForm
  133.         sourceForm: self
  134.         halftoneForm: nil
  135.         combinationRule: 3
  136.         destOrigin: 0@0
  137.         sourceOrigin: 0@0
  138.         extent: rotSize asPoint
  139.         clipRect: (0@0 extent: width@height)) copyBits.
  140.     ^rotForm rotate45Square!
  141.  
  142. shiftBy: aPoint 
  143.     "The new form will be aPoint larger than myself. Lines will be aPoint bigger."
  144.  
  145.     | saveOffset shiftedForm box x y |
  146.     saveOffset _ self offset.
  147.     self offset: 0 @ 0.
  148.     shiftedForm _ Form new extent: (self extent + aPoint).
  149.     box _ shiftedForm boundingBox.
  150.     x _ aPoint x.
  151.     [x >= 0]
  152.         whileTrue:
  153.             [y _ aPoint y.
  154.             [y >= 0]
  155.                 whileTrue:
  156.                     [shiftedForm
  157.                         copyBits: box
  158.                         from: self
  159.                         at: (x @ y)
  160.                         clippingBox: box
  161.                         rule: Form under
  162.                         mask: nil.
  163.                         y _ y - 1].
  164.             x _ x - 1].
  165.     self offset: saveOffset.
  166.     shiftedForm offset: offset + (aPoint // 2).
  167.     ^shiftedForm!
  168.  
  169. shiftShrinkBy: aPoint 
  170.     "Return aForm first shifted and then shrunk by aPoint 
  171.     factor. "
  172.  
  173.     aPoint x > 1 | (aPoint y > 1) ifFalse: [^self].
  174.     ^(self shiftBy: aPoint - (1 @ 1)) shrinkBy: aPoint! !
  175.